<?php
/**
 * Глобальный класс управления медиа-ресурсами (загружаемыми файлами) на сайте
 * 
 * @category Phorm
 * @package Media
 * @name /Phorm/Media.php
 * @copyright phorm.ru
 * @since 29.11.2011
 * @author vladimir@kachalov.net
 */

class Phorm_Media extends Phorm_Model {
	
	/**
	 * Возвращает тип файла по расширению
	 *
	 * @param string $ext
	 * @return string
	 */
	
	public function getFileType($ext) {
		
		/*$types = Phorm_Config::xml('forms/control/media.xml','filetypes');
		
		foreach ($types as $type=>$extensions) {
			$extensions = explode(',',$extensions);
			if(in_array($ext,$extensions)) return $type;
		}*/
		
		return 'file';
		
	}
	
	
	/**
	 * Возвращает список медиа-ресурсов
	 *
	 * @param array $options Массив опций для выборки
	 * @return array
	 */
	
	public function getMediaList($options = array()) {
		
		$select = $this->_db->select()
				-> from(array('AA'=>'pw_media'), new Zend_Db_Expr('SQL_CALC_FOUND_ROWS AA.*'))
				-> where('isexist=?','yes');
				
		// Дата публикации
		if(isset($options['loaded_from']) && trim($options['loaded_from'])!='') {
			$select -> where("AA.loaded>=".strtotime($options['loaded_from']));
		}
		if(isset($options['loaded_to']) && trim($options['loaded_to'])!='') {
			$select -> where("AA.loaded<=".strtotime($options['loaded_to']));
		}
		
		// Добавляем условие по категории
		if(isset($options['mediatype'])) {
			$select -> where("AA.mediatype=?",$options['mediatype']);
		}
		
		// Сортировки
		if(isset($options['sortField']) && in_array($options['sortField'],array('mediaid','loaded','medianame','mediatype'))) {
			$sortOrder = isset($options['sortOrder']) && $options['sortOrder']=='desc' ? ' DESC' : ' ASC';
			$select -> order('AA.'.$options['sortField'].$sortOrder);
		} else {
			$select -> order('mediaid DESC');
		}
		
		// Устанавливаем количество отдаваемых строк
		if (isset($options["rowsperpage"])) {
			$select -> limitPage($this->getCurrentPage(),(int)$options["rowsperpage"]);
		} else {
			$select -> limitPage($this->getCurrentPage(),$this->getPerPage());
		}
				
		return $this->_db->fetchAll($select);
		
	}
	
	
	/**
	 * Возвращает информацию о медиа-ресурсе
	 *
	 * @param int $mediaid
	 * @return array
	 */
	
	public function getMediaInfo($mediaid) {
		
		$select = $this->_db->select()
				-> from('pw_media')
				-> where('mediaid=?',$mediaid)
				-> where('isexist=?','yes');
				
		return $this->_db->fetchRow($select);
		
		
	}
	
	
	/**
	 * Сохраняет информацию о загруженном файле
	 *
	 * @param array $fileinfo Массив информации о файле из File_Transfer_Adapter_Abstract::getFileInfo + mediatype
	 * 			@see File_Transfer_Adapter_Abstract::getFileInfo
	 * @return array Массив информации о новом медиа-ресурсе
	 * @todo Добавить чтение IPTC, XMP и других мета-данных (заголовок, описание, ключевые слова), пока мы делаем заголовок из названия файла
	 */
	
	public function saveUploadedFile($fileinfo) {
		
		$this->_db->beginTransaction();
		
		try {
			
			$data = array(
				'loaded' => time(),
				'medianame' => preg_replace('#[^a-zа-я0-9]+#iu',' ',pathinfo($fileinfo['name'],PATHINFO_FILENAME)),
				'filename' => $fileinfo['name'],
				'mediatype' => $fileinfo['mediatype'],
				'filetype' => $fileinfo['type'],
				'fileext' => strtolower(pathinfo($fileinfo['name'],PATHINFO_EXTENSION)),
				'filepath' => date('Y/m/d'),
				'filesize' => filesize($fileinfo['tmp_name']),
				'userid' => $this->_usersession->UserData['userid'],
			);
			
			if($this->_db->insert('pw_media',$data)) {
				
				$data['mediaid'] = $this->_db->lastInsertId();
				
				/**
				 * Сохранение файла
				 * Шаблон пути для сохранения - /uploads/media/год/месяц/день/id_медиа.расш
				 */
				
				$savepath = DOCUMENT_PATH . '/uploads/media/' . $data['filepath'];
				
				if(!is_dir($savepath)) {
					if(!@mkdir($savepath, 0777, true)) {
						$this->_errors[] = error_get_last();
						$this->_db->rollBack();
						return false;
					}
				}
				
				if(!@move_uploaded_file($fileinfo['tmp_name'], $savepath . '/' . $data['mediaid'] . '.' . $data['fileext'])) {
					$this->_errors[] = error_get_last();
					$this->_db->rollBack();
					return false;
				}
				
				$this->_db->commit();
				
			} else {
				
				$this->_errors[] = 'Не удалось вставить данные в таблицу pw_media';
				$this->_db->rollBack();
				
			}
										  
			return null !== ($data = $this->getMediaInfo($data['mediaid'])) ? $data : false;
			
		} catch (Exception $e) {
			
			$this->_db->rollBack();	
			$this->_errors[] = $e->getMessage();
			
		}
		
		return false;
		
	}
	
	
	public function getLocalFileForm() {
		
		$form = new Phorm_Form('forms/control/media.xml','localadd');
		return $form;
		
	}
	
	
	public function getRemoteFileForm() {
		
		$form = new Phorm_Form('forms/control/media.xml','remoteadd');
		return $form;
		
	}
	
	
	public function getEditFileForm() {
		
		$form = new Phorm_Form('forms/control/media.xml','edit');
		return $form;
		
	}
	
}
